#ifndef _ABSTRACTGRAMMARERRORHANDLERS_H_
#define _ABSTRACTGRAMMARERRORHANDLERS_H_
#include <QObject>
#include "ParseException.h"
#include "Token.h"

class TokenManager;

class GrammarErrorHandlers: public QObject
{
    Q_OBJECT
public:
    int errCount();
protected:
    GrammarErrorHandlers();
    void markLastAsSuiteStart();
    void handleRParensNearButNotCurrent(const ParseException& ex);

    void addAndReport(const ParseException& ex, const QString & msg);
    void handleNoNewline(const ParseException& ex);
    void handleErrorInImport(const ParseException& ex);
    void handleErrorInCompountStmt(const ParseException& ex);
    void handleNoEof(const ParseException& ex);
    void handleErrorInIndent(const ParseException& ex);
    void handleErrorInStmt(const ParseException& ex);
    void handleErrorInDedent(const ParseException& ex);
    void handleNoNewlineInSuiteFound();
    void handleNoSuiteMatch(const ParseException& ex);
    void handleNoValInDict(const ParseException& ex);
    TokenPtr handleErrorInName(const ParseException& ex);
    void handleUnexpectedToken(int expectedKind, const QString& expectedToken, const TokenPtr& actual);
    void handleParseError(const TokenPtr& last, const TokenPtr& unexpected, const QString& production);
    void handleParseError(const ParseException& ex);

    virtual TokenPtr getCurrentToken() = 0;
    virtual TokenManager* getTokenManager() = 0;
    virtual void setCurrentToken(const TokenPtr& t) = 0;
signals:
    void parseError(const QString& msg, int line, int col);
protected:
    int _lastSuiteStartCol;
    int _errorCount;
};

#endif
